﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using Vowei.Core.Models;
using System.Diagnostics;

namespace Vowei.Core.Models
{
    /// <summary>
    /// 表示一个项目
    /// </summary>
    [DataContract]
    public class Project : Milestone
    {
        public class SupportedScm
        {
            public const string Mercurial = "Mercurial";
            public const string Svn = "Svn";
            public const string Tfs = "Tfs";
            public const string SharePoint = "SharePoint";
        }

        public Project()
        {
            ResourceAssignments = new List<ResourceAssignment>();
            // 默认使用标准的资源日历
            ProjectBaseCalendarId = Constants.BuiltIn.ResouceCalendar.StandardCalendarId;
        }

        /// <summary>
        /// 负责整个项目的人员，也就是在项目管理中Accountable的那个人。
        /// </summary>
        [Required]
        [Display(Name = "负责人")]
        [DataMember]
        public string Owner { get; set; }

        /// <summary>
        /// 获取配置管理系统的路径
        /// </summary>
        /// <remarks>
        /// 这个路径可以是在因特网上,大家都可以访问到的,也可以是在用户企业内部的路径
        /// </remarks>
        [Display(Name = "配置系统地址")]
        [DataMember]
        public string ScmUrl { get; set; }

        /// <summary>
        /// 设置和获取配置管理系统的类型
        /// </summary>
        /// <remarks>
        /// 关于网站支持的配置系统列表，请参考:<seealso cref="Project.SupportedScm"/>
        /// </remarks>
        [Display(Name = "配置系统类型")]
        [DataMember]
        public string ScmType { get; set; }

        [Display(Name = "项目基准工时日历")]
        public ResourceCalendar ProjectBaseCalendar { get; set; }

        public Guid ProjectBaseCalendarId { get; set; }

        public List<ResourceAssignment> ResourceAssignments { get; private set; }

        /// <summary>
        /// 创建一个收集反馈的工作流
        /// </summary>
        /// <param name="task">要收集反馈的工作草稿</param>
        /// <param name="reviewers">审核者</param>
        /// <returns>分配给这些审核人员的审核任务列表</returns>
        /// <remarks>
        /// 如果审核者包括被审核的任务的负责人自己，那么就会从中删除掉负责人的任务
        /// 
        /// 另外，只有当工作流上所有的任务都已经完成以后，才可以说被审核的任务已经完成，否则等待审核的任务的进度最大不能超过90%。
        /// 也就是说，只有所有的审核者关闭了各自的任务，才能关闭这个被审核的任务
        /// </remarks>
        public Ticket[] CreateCollectFeedbackFlow(Ticket ticket, IUser[] reviewers)
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// 创建一个简单的审批工作流
        /// </summary>
        /// <param name="task">要审批的任务</param>
        /// <param name="approvers">各级审批人员，审批权限（级别）随着数组中索引值的增加和增大</param>
        /// <returns>分配给这些审批人员的任务列表</returns>
        /// <remarks>
        /// 这个函数只实现了简单的审批工作流，只有列表里最后一个审批任务完成，才能关闭任务。即无论approvers数组前面
        /// 的几个任务是否已经完成，只要最后一个（也就是权限最大的人员）做出决定，那么就是终极决定。系统应该自动关闭
        /// 前面approvers数组中其他成员的任务。
        /// 
        /// 但是，当任务完成审批以后，如果有任何人修改了<seealso cref="ticket"/>任务的状态，或者关联的审批任务的
        /// 状态（比如说激活任务），那么就需要从被激活的任务开始，激活所有的审批任务。
        /// 
        /// 函数不会验证审批者是否已经在任务的项目组里，这个验证工作由调用者完成
        /// </remarks>
        public Ticket[] CreateApprovalFlow(Ticket ticket, IUser[] approvers)
        {
            throw new NotImplementedException();
        }
    }
}